package cn.djb.day5;


/**
 * 在一个 n * m 的二维数组中，每一行都按照从左到右递增的顺序排序，每一列都按照从上到下递增的顺序排序。请完成一个高效的函数，输入这样的一个二维数组和一个整数，判断数组中是否含有该整数。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
class Solution_1 {

    /**
     * 确定行
     * <p>
     * 查找
     *
     * @param matrix
     * @param target
     * @return
     */
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        for (int[] nums : matrix) {
            int length = nums.length;
            if (length > 0) {
                if (nums[0] == target) return true;
                if (nums[length - 1] == target) return true;
                if (nums[0] < target && nums[length - 1] > target) {
                    //二分查找
                    if (dichotomy(nums, target)) return true;
                }
            }

        }
        return false;
    }

    private boolean dichotomy(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int m = (left + right) / 2;
            int tmp = nums[m];
            if (tmp == target) {
                return true;
            } else if (tmp < target) {
                left = m + 1;
            } else {
                right = m - 1;
            }
        }
        return nums[left] == target;
    }

    /**
     * 时间复杂度 O(N+M)
     * 题解 ;https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/solution/mian-shi-ti-04-er-wei-shu-zu-zhong-de-cha-zhao-zuo/
     *
     * @param matrix
     * @param target
     * @return
     */
    public boolean findNumberIn2DArray2(int[][] matrix, int target) {
        int i = matrix.length - 1, j = 0;
        while(i >= 0 && j < matrix[0].length)
        {
            if(matrix[i][j] > target) i--;
            else if(matrix[i][j] < target) j++;
            else return true;
        }
        return false;
    }

}